package com.halfsword.creativecraft.loot;

import com.google.common.base.Suppliers;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.minecraftforge.common.loot.IGlobalLootModifier;
import net.minecraftforge.common.loot.LootModifier;
import net.minecraftforge.registries.ForgeRegistries;
import org.jetbrains.annotations.NotNull;

import java.util.function.Supplier;

/**
 * 自定义全局战利品修改器，用于向战利品表中添加指定物品
 * deepseek 提供修复，注释问题
 *
 *
 *
 *
 *
 *
 *
 */
public class AddItemModifier extends LootModifier {

    // 使用 Suppliers.memoize 缓存 CODEC 实例以提高性能
    public static final Supplier<Codec<AddItemModifier>> CODEC = Suppliers.memoize(() ->
            RecordCodecBuilder.create(inst ->
                    // 基础战利品条件
                    codecStart(inst)
                            // 添加 'item' 字段，从注册表中获取物品
                            .and(ForgeRegistries.ITEMS.getCodec()
                                    .fieldOf("item")
                                    .forGetter(m -> m.item))
                            .apply(inst, AddItemModifier::new)
            )
    );

    private final Item item;  // 要添加的物品

    /**
     * 构造函数
     *
     * @param conditionsIn 战利品条件数组，决定何时应用此修改器
     * @param item         要添加到战利品中的物品
     */
    public AddItemModifier(LootItemCondition[] conditionsIn, Item item) {
        super(conditionsIn);
        this.item = item;
    }

    /**
     * 应用战利品修改
     *
     * @param generatedLoot 当前生成的战利品列表
     * @param context       战利品生成上下文
     * @return 修改后的战利品列表
     */
    @NotNull
    @Override
    protected ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot, LootContext context) {
        // 检查所有条件是否满足（AND 关系）
        if (!this.test(context)) {
            return generatedLoot;
        }

        // 添加物品到战利品列表
        generatedLoot.add(new ItemStack(this.item));
        return generatedLoot;
    }

    /**
     * 获取此修改器的编解码器
     *
     * @return 注册的编解码器实例
     */
    @Override
    public Codec<? extends IGlobalLootModifier> codec() {
        return CODEC.get();
    }

    /**
     * 检查所有战利品条件是否满足
     *
     * @param context 战利品生成上下文
     * @return 所有条件是否满足
     */
    private boolean test(LootContext context) {
        for (LootItemCondition condition : this.conditions) {
            if (!condition.test(context)) {
                return false;
            }
        }
        return true;
    }
}
